import java.util.Arrays;
import java.util.Scanner;
public class Task2 {

    // 声明成员变量
    static String[][] checkerboardArr = new String[17][17]; // 用于表示棋盘
    static int[][] grandTotalArr = new int[16+8][16+8]; // 累计数组，黑色记为-1，白色记为1，用于判断五子连珠

    // 初始化棋盘
    void checkerboardInitial() {
        //String[][] checkerboardArr = new String[17][17];
        for(int i=0; i<checkerboardArr.length; i++) {
            for(int j=0; j<checkerboardArr[i].length; j++) {
                if(i==0 && j!=0) {  // 第一行(除去第一列)的1~f
                    //返回由十六进制（基数为16）的参数表示的无符号整数值的字符串表示形式。
                    checkerboardArr[i][j] = Integer.toHexString(j-1);
                } else if (i!=0 && j==0) {  // 第一列(除去第一行)的1~f
                    checkerboardArr[i][j] = Integer.toHexString(i-1);
                } else if(i==0 && j==0) { //第一行第一列是空格
                    checkerboardArr[i][j] = " ";
                } else { //其余部分是 +
                    checkerboardArr[i][j] = "+";
                }
            }
        }
    }

    // 绘制棋盘
    void checkerboardShow(String[][] checkerboard) {
        for(int i=0; i<checkerboard.length; i++) {
            for(int j=0; j<checkerboard[i].length; j++) {
                System.out.print(checkerboard[i][j] + "   ");
            }
            System.out.println();
        }
    }

    // 绘制累计数组
    void grandTotalArrShow(int[][] grandTotalArr) {
        for(int i=0; i<grandTotalArr.length; i++) {
            for(int j=0; j<grandTotalArr[i].length; j++) {
                System.out.print(grandTotalArr[i][j] + "   ");
            }
            System.out.println();
        }
    }

    // 更新棋盘
    int[] updateCheckerboard(String[] coordinate, String role) {
        int x = Integer.parseInt(coordinate[0]);
        int y = Integer.parseInt(coordinate[1]);
        //System.out.println("54行 x: "+x);
        //System.out.println("55行 y: "+y);
        if(role.equals("black")) { // 黑方下棋
            grandTotalArr[x+4][y+4] = -1;
            checkerboardArr[x+1][y+1] = "B";
        } else {
            grandTotalArr[x+4][y+4] = 1;
            checkerboardArr[x+1][y+1] = "W";
        }
        return new int[]{x,y}; //返回落子位置
    }

    // 提示黑方和白方分别下棋并重新绘制棋盘
    // 黑方下棋
    String[] blackPlays() {
        System.out.println("请黑方下棋：");
        System.out.print("输入格式：横坐标 纵坐标 --->  ");
        Scanner sc = new Scanner(System.in);
        int x = Integer.parseInt(sc.next());
        int y = Integer.parseInt(sc.next());
        if(x<0 || x>15 || y<0 || y>15)
            return null;
        return new String[]{String.valueOf(x), String.valueOf(y)};
        //return new String[]{sc.next(), sc.next()};
    }
    // 白方下棋
    String[] whitePlays() {
        System.out.println("请白方下棋：");
        System.out.print("输入格式：横坐标 纵坐标 --->  ");
        Scanner sc = new Scanner(System.in);
        int x = Integer.parseInt(sc.next());
        int y = Integer.parseInt(sc.next());
        if(x<0 || x>15 || y<0 || y>15)
            return null;
        return new String[]{String.valueOf(x), String.valueOf(y)};
        //return new String[]{sc.next(), sc.next()};
    }

    // 3.判断是否形成五子连珠
    boolean judge(int[] location) {
        boolean winOrLose = false;
        int fiveCount = 0;  // 五个连续的子加起来得到的数字
        int x = location[0];
        //System.out.println("99行 x: "+x);
        int y = location[1];
        //System.out.println("101行 y: "+y);

        // 判断左右方向，横坐标固定，从当前位置纵坐标坐标往左4位到当前位置纵坐标往右4位，扫描一遍
        for(int i=y-4; i<=y; i++) {
            fiveCount = 0;
            for(int j=i; j<=i+4; j++) fiveCount += grandTotalArr[x+4][j+4];
            winOrLose = fiveCount==5 || fiveCount==-5;
            if(winOrLose) return winOrLose;
        }

        // 判断上下方向，纵坐标固定，从当前位置横坐标往上4位到当前位置横坐标往下4位，扫一遍
        for(int i=x-4; i<=x; i++) {
            fiveCount = 0;
            for(int j=i; j<=i+4; j++) fiveCount += grandTotalArr[j+4][y+4];
            winOrLose = fiveCount==5 || fiveCount==-5;
            if(winOrLose) return winOrLose;
        }

        // 判断左上到右下
        /*  5 6 7 8 9     假设当前位置(X,Y)=(5,9)  y-x = 9-5=4  从(1,1+4)也就是(1,5)处开始
          1 X
          2   X
          3     X
          4       X
          5         O
                      X
                        X
                          X
                            X
         */
        for(int i=x-4; i<=x; i++) {
            fiveCount = 0;
            for(int j=i; j<=i+4; j++) fiveCount += grandTotalArr[j+4][y-x+j+4];
            winOrLose = fiveCount==5 || fiveCount==-5;
            if(winOrLose) return winOrLose;
        }

        // 判断右上到左下
        for(int i=x-4; i<=x; i++) {
            fiveCount = 0;
            for(int j=i; j<=i+4; j++) fiveCount += grandTotalArr[j+4][x+y-j+4];
            winOrLose = fiveCount==5 || fiveCount==-5;
            if(winOrLose) return winOrLose;
        }

        return winOrLose;
    }

    public static void main(String[] args){

        String[] coordinate = new String[2]; // 存放横纵坐标

        boolean blackWin = false;
        boolean whiteWin = false;
        int step = 0;  // 统计步数，偶数步黑方下棋，奇数步白方下棋
        int[] location = new int[2];   // 落子位置 x、y

        Task2 task2 = new Task2();

        // 初始化棋盘
        task2.checkerboardInitial();

        // 绘制棋盘
        task2.checkerboardShow(checkerboardArr);

        // 提示黑方和白方分别下棋并重新绘制棋盘
        while(!blackWin && !whiteWin) {
            if(step %2 == 0) {   // 黑方下棋
                coordinate = task2.blackPlays();
                //System.out.println("157行: "+Arrays.toString(coordinate));
                if(coordinate == null){
                    System.out.println("该位置超出棋盘范围，请重新下棋");
                    continue;
                }else if(grandTotalArr[Integer.parseInt(coordinate[0])+4][Integer.parseInt(coordinate[1])+4] != 0){
                    System.out.println("该位置已有棋子");
                    continue;
                }
                // 重新绘制棋盘
                location = task2.updateCheckerboard(coordinate, "black");
                task2.checkerboardShow(checkerboardArr);
                //System.out.println("-----------------------------------------------------------------");
                //task2.grandTotalArrShow(grandTotalArr);
                // 判断是否五子连珠
                blackWin = task2.judge(location);

            } else {       // 白方下棋
                coordinate = task2.whitePlays();
                //System.out.println("174行: "+Arrays.toString(coordinate));
                if(coordinate == null){
                    System.out.println("该位置超出棋盘范围，请重新下棋");
                    continue;
                }else if(grandTotalArr[Integer.parseInt(coordinate[0])+4][Integer.parseInt(coordinate[1])+4] != 0){
                    System.out.println("该位置已有棋子");
                    continue;
                }
                // 重新绘制棋盘
                location = task2.updateCheckerboard(coordinate, "white");
                task2.checkerboardShow(checkerboardArr);
                //System.out.println("-----------------------------------------------------------------");
                //task2.grandTotalArrShow(grandTotalArr);
                // 判断是否五子连珠
                whiteWin = task2.judge(location);
            }
            step++;
        }

        // 输出游戏结果
        if(blackWin)  System.out.println("恭喜黑方获胜！");
        if(whiteWin)  System.out.println("恭喜白方获胜！");
    }
}
